package com.dms.modules.product.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dms.modules.product.dto.ProductDTO;
import com.dms.modules.product.dto.ProductSearchDTO;
import com.dms.modules.product.entity.Product;
import com.dms.modules.product.vo.ProductDetailVO;
import com.dms.modules.product.vo.ProductSpecVO;
import com.dms.modules.product.vo.ProductSkuVO;

import java.util.List;
import java.util.Map;

/**
 * 商品服务接口
 */
public interface ProductService extends IService<Product> {

    /**
     * 获取商品详情
     *
     * @param id 商品ID
     * @return 商品详情VO
     */
    ProductDetailVO getProductDetail(Long id);

    /**
     * 获取商家的商品列表
     *
     * @param merchantId 商家ID
     * @param pageNum    页码
     * @param pageSize   每页大小
     * @return 商品分页列表
     */
    IPage<Product> getProductsByMerchant(Long merchantId, Integer pageNum, Integer pageSize);

    /**
     * 搜索商品
     *
     * @param search 搜索条件
     * @return 商品分页列表
     */
    IPage<Product> search(ProductSearchDTO search);

    /**
     * 创建商品
     *
     * @param productDTO 商品信息
     * @return 商品ID
     */
    Long createProduct(ProductDTO productDTO);

    /**
     * 更新商品
     *
     * @param productDTO 商品信息
     * @return 是否成功
     */
    boolean updateProduct(ProductDTO productDTO);

    /**
     * 删除商品
     *
     * @param id 商品ID
     * @return 是否成功
     */
    boolean deleteProduct(Long id);

    /**
     * 更新商品状态
     *
     * @param id 商品ID
     * @param type 状态类型
     * @param value 状态值
     * @return 是否成功
     */
    boolean updateProductStatus(Long id, ProductStatusType type, Boolean value);

    /**
     * 更新商品库存
     *
     * @param id    商品ID
     * @param stock  库存数量
     * @return 是否成功
     */
    boolean updateStock(Long id, Integer stock);

    /**
     * 增加商品浏览次数
     *
     * @param id 商品ID
     * @return 是否成功
     */
    boolean incrementViewCount(Long id);

    /**
     * 获取热门商品
     *
     * @param limit 返回数量
     * @return 热门商品列表
     */
    List<ProductDetailVO> getHotProducts(Integer limit);

    /**
     * 获取新品列表
     *
     * @param limit 返回数量
     * @return 新品列表
     */
    List<ProductDetailVO> getNewProducts(Integer limit);

    /**
     * 获取搜索建议
     *
     * @param keyword 关键词
     * @param limit 返回数量
     * @return 搜索建议列表
     */
    List<String> getSearchSuggestions(String keyword, Integer limit);

    /**
     * 获取用户搜索历史
     *
     * @param userId 用户ID
     * @param limit 返回数量
     * @return 搜索历史列表
     */
    List<String> getSearchHistory(Long userId, Integer limit);

    /**
     * 清除用户搜索历史
     *
     * @param userId 用户ID
     */
    void clearSearchHistory(Long userId);

    /**
     * 商家搜索商品
     *
     * @param search 搜索条件
     * @param status 商品状态
     * @return 商品分页列表
     */
    IPage<Product> searchMerchantProducts(ProductSearchDTO search, Integer status);

    /**
     * 管理员搜索商品
     *
     * @param search 搜索条件
     * @param auditStatus 审核状态
     * @return 商品分页列表
     */
    IPage<Product> adminSearchProducts(ProductSearchDTO search, Integer auditStatus);

    /**
     * 获取待审核商品列表
     *
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 商品分页列表
     */
    IPage<Product> getAuditPendingProducts(Integer pageNum, Integer pageSize);

    /**
     * 获取商品详情列表
     *
     * @param ids 商品ID列表
     * @return 商品详情列表
     */
    List<ProductDetailVO> getProductDetails(List<Long> ids);

    /**
     * 将商品列表转换为商品详情VO列表
     *
     * @param products 商品列表
     * @return 商品详情VO列表
     */
    List<ProductDetailVO> convertToProductDetailVO(List<Product> products);

    /**
     * 获取商品列表
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @param categoryId 分类ID
     * @param isNew 是否新品
     * @param isHot 是否热销
     * @param isRecommend 是否推荐
     * @return 商品分页列表
     */
    IPage<Product> getProducts(Integer pageNum, Integer pageSize, Long categoryId, 
                             Boolean isNew, Boolean isHot, Boolean isRecommend);

    /**
     * 商品状态类型枚举
     */
    enum ProductStatusType {
        STATUS,
        RECOMMEND,
        NEW,
        HOT,
        AUDIT
    }

    /**
     * 统计商家商品总数
     */
    Integer countByMerchantId(Long merchantId);

    /**
     * 统计商家特定状态的商品数量
     */
    Integer countByMerchantIdAndStatus(Long merchantId, Integer status);

    /**
     * 更新商品总库存（根据SKU库存总和）
     * @param productId 商品ID
     * @return 是否成功
     */
    boolean updateTotalStock(Long productId);

    /**
     * 获取商品规格信息
     * @param productId 商品ID
     * @return 规格信息列表
     */
    List<ProductSpecVO> getProductSpecs(Long productId);

    /**
     * 获取商品SKU列表
     * @param productId 商品ID
     * @return SKU信息列表
     */
    List<ProductSkuVO> getProductSkus(Long productId);
} 